From ce8bbfaf547c7b96a52e5da34e5022461ff80556 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Jan 2021 08:37:32 -0800 Subject: [PATCH 1/6] Windows: Fix some type conversion warnings. --- Windows/DinputDevice.cpp | 31 +++++++++++++++++-------------- Windows/DinputDevice.h | 12 ++++++------ 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/Windows/DinputDevice.cpp b/Windows/DinputDevice.cpp index d59874d680..4d415b7c8a 100644 --- a/Windows/DinputDevice.cpp +++ b/Windows/DinputDevice.cpp @@ -203,7 +203,7 @@ DinputDevice::~DinputDevice() { } } -void SendNativeAxis(int deviceId, short value, short &lastValue, int axisId) { +void SendNativeAxis(int deviceId, int value, int &lastValue, int axisId) { if (value == lastValue) return; @@ -216,11 +216,14 @@ void SendNativeAxis(int deviceId, short value, short &lastValue, int axisId) { lastValue = value; } -inline float Signs(short val) { +inline int Signs(int val) { return (0 < val) - (val < 0); } -inline float LinearMaps(short val, short a0, short a1, short b0, short b1) { +inline int LinearMaps(int val, int a0, int a1, int b0, int b1) { + return b0 + (((val - a0) * (b1 - b0)) / (a1 - a0)); +} +inline float LinearMaps(float val, float a0, float a1, float b0, float b1) { return b0 + (((val - a0) * (b1 - b0)) / (a1 - a0)); } @@ -244,11 +247,11 @@ int DinputDevice::UpdateState() { axis.deviceId = DEVICE_ID_PAD_0 + pDevNum; // Circle to Square mapping, cribbed from XInputDevice - float sx = js.lX; - float sy = js.lY; + float sx = (float)js.lX; + float sy = (float)js.lY; float scaleFactor = sqrtf((sx * sx + sy * sy) / std::max(sx * sx, sy * sy)); - js.lX = (short)(sx * scaleFactor); - js.lY = (short)(sy * scaleFactor); + js.lX = (int)(sx * scaleFactor); + js.lY = (int)(sy * scaleFactor); // Linear range mapping (used to invert deadzones) float dz = g_Config.fDInputAnalogDeadzone; @@ -257,20 +260,20 @@ int DinputDevice::UpdateState() { float md = std::max(dz, idz); float st = g_Config.fDInputAnalogSensitivity; - float magnitude = sqrtf(js.lX * js.lX + js.lY * js.lY); + float magnitude = sqrtf((float)(js.lX * js.lX + js.lY * js.lY)); if (magnitude > dz * 10000.0f) { if (idzm == 1) { - short xSign = Signs(js.lX); - if (xSign != 0.0f) { - js.lX = LinearMaps(js.lX, xSign * (short)(dz * 10000), xSign * 10000, xSign * (short)(md * 10000), xSign * 10000 * st); + int xSign = Signs(js.lX); + if (xSign != 0) { + js.lX = LinearMaps(js.lX, xSign * (int)(dz * 10000), xSign * 10000, xSign * (int)(md * 10000), xSign * (int)(st * 10000)); } } else if (idzm == 2) { - short ySign = Signs(js.lY); - if (ySign != 0.0f) { - js.lY = LinearMaps(js.lY, ySign * (short)(dz * 10000.0f), ySign * 10000, ySign * (short)(md * 10000.0f), ySign * 10000 * st); + int ySign = Signs(js.lY); + if (ySign != 0) { + js.lY = LinearMaps(js.lY, ySign * (int)(dz * 10000.0f), ySign * 10000, ySign * (int)(md * 10000.0f), ySign * (int)(st * 10000)); } } else if (idzm == 3) diff --git a/Windows/DinputDevice.h b/Windows/DinputDevice.h index 796b5e265c..d8ecc8762f 100644 --- a/Windows/DinputDevice.h +++ b/Windows/DinputDevice.h @@ -62,10 +62,10 @@ private: bool analog; BYTE lastButtons_[128]; WORD lastPOV_[4]; - short last_lX_; - short last_lY_; - short last_lZ_; - short last_lRx_; - short last_lRy_; - short last_lRz_; + int last_lX_; + int last_lY_; + int last_lZ_; + int last_lRx_; + int last_lRy_; + int last_lRz_; }; From 84aa33970b21fa463d3bfa3f94ed15bb0d77b635 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Jan 2021 08:37:54 -0800 Subject: [PATCH 2/6] Debugger: Fix some type conversion warnings. --- Common/Math/expression_parser.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Common/Math/expression_parser.cpp b/Common/Math/expression_parser.cpp index 9499cce7e0..e24c056a07 100644 --- a/Common/Math/expression_parser.cpp +++ b/Common/Math/expression_parser.cpp @@ -462,7 +462,7 @@ bool parsePostfixExpression(PostfixExpression& exp, IExpressionFunctions* funcs, break; case EXOP_SIGNMINUS: // -0 if (useFloat) - valueStack.push_back(0.0 - fArg[0]); + valueStack.push_back((uint32_t)(0.0f - fArg[0])); else valueStack.push_back(0-arg[0]); break; @@ -474,7 +474,7 @@ bool parsePostfixExpression(PostfixExpression& exp, IExpressionFunctions* funcs, break; case EXOP_MUL: // a*b if (useFloat) - valueStack.push_back(fArg[1]*fArg[0]); + valueStack.push_back((uint32_t)(fArg[1] * fArg[0])); else valueStack.push_back(arg[1]*arg[0]); break; @@ -485,7 +485,7 @@ bool parsePostfixExpression(PostfixExpression& exp, IExpressionFunctions* funcs, return false; } if (useFloat) - valueStack.push_back(fArg[1]/fArg[0]); + valueStack.push_back((uint32_t)(fArg[1] / fArg[0])); else valueStack.push_back(arg[1]/arg[0]); break; @@ -499,13 +499,13 @@ bool parsePostfixExpression(PostfixExpression& exp, IExpressionFunctions* funcs, break; case EXOP_ADD: // a+b if (useFloat) - valueStack.push_back(fArg[1]+fArg[0]); + valueStack.push_back((uint32_t)(fArg[1] + fArg[0])); else valueStack.push_back(arg[1]+arg[0]); break; case EXOP_SUB: // a-b if (useFloat) - valueStack.push_back(fArg[1]-fArg[0]); + valueStack.push_back((uint32_t)(fArg[1] - fArg[0])); else valueStack.push_back(arg[1]-arg[0]); break; From f57c642f0b5d8cf81d5cfc31646d59bf9aa1bb97 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Jan 2021 08:38:27 -0800 Subject: [PATCH 3/6] Common: Fix logging shutdown race condition. Got a crash during logging on another thread during shutdown. --- Common/LogManager.cpp | 4 ++++ UI/NativeApp.cpp | 16 ++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Common/LogManager.cpp b/Common/LogManager.cpp index 1a7c6cffaa..113dc8200a 100644 --- a/Common/LogManager.cpp +++ b/Common/LogManager.cpp @@ -156,6 +156,9 @@ LogManager::~LogManager() { #endif } + // Make sure we don't shutdown while logging. RemoveListener locks too, but there are gaps. + std::lock_guard listeners_lock(listeners_lock_); + if (fileLog_) delete fileLog_; #if !defined(MOBILE_DEVICE) || defined(_DEBUG) @@ -262,6 +265,7 @@ bool LogManager::IsEnabled(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type) } void LogManager::Init(bool *enabledSetting) { + _assert_(logManager_ == nullptr); logManager_ = new LogManager(enabledSetting); } diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index d51adad672..7fdf56e5e9 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -1402,14 +1402,6 @@ void NativeShutdown() { #endif g_Config.Save("NativeShutdown"); - // Avoid shutting this down when restarting core. - if (!restarting) - LogManager::Shutdown(); - -#ifdef ANDROID_NDK_PROFILER - moncleanup(); -#endif - INFO_LOG(SYSTEM, "NativeShutdown called"); ShutdownWebServer(); @@ -1420,6 +1412,14 @@ void NativeShutdown() { g_Discord.Shutdown(); + // Avoid shutting this down when restarting core. + if (!restarting) + LogManager::Shutdown(); + +#ifdef ANDROID_NDK_PROFILER + moncleanup(); +#endif + if (logger) { delete logger; logger = nullptr; From 83644ec1b81377299a76095804192dd6cf12736e Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Jan 2021 08:42:23 -0800 Subject: [PATCH 4/6] Android: Remove old NDK profiler. Pretty sure this no longer works. --- UI/MainScreen.cpp | 11 - UI/NativeApp.cpp | 10 - android/android-ndk-profiler/Android.mk | 15 - android/android-ndk-profiler/COPYING | 674 ------------------ android/android-ndk-profiler/README.mkd | 5 - .../armeabi-v7a/libandroid-ndk-profiler.a | Bin 38806 -> 0 bytes .../armeabi/libandroid-ndk-profiler.a | Bin 38106 -> 0 bytes android/android-ndk-profiler/prof.h | 22 - android/jni/Android.mk | 4 - android/jni/Locals.mk | 6 - headless/Headless.cpp | 16 - 11 files changed, 763 deletions(-) delete mode 100644 android/android-ndk-profiler/Android.mk delete mode 100644 android/android-ndk-profiler/COPYING delete mode 100644 android/android-ndk-profiler/README.mkd delete mode 100644 android/android-ndk-profiler/armeabi-v7a/libandroid-ndk-profiler.a delete mode 100644 android/android-ndk-profiler/armeabi/libandroid-ndk-profiler.a delete mode 100644 android/android-ndk-profiler/prof.h diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 7880268327..9e3a30adb0 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -68,11 +68,6 @@ #include "Common/CommonWindows.h" #endif -#ifdef ANDROID_NDK_PROFILER -#include -#include "android/android-ndk-profiler/prof.h" -#endif - #include bool MainScreen::showHomebrewTab = false; @@ -1372,12 +1367,6 @@ UI::EventReturn MainScreen::OnExit(UI::EventParams &e) { // Request the framework to exit cleanly. System_SendMessage("finish", ""); -#ifdef __ANDROID__ -#ifdef ANDROID_NDK_PROFILER - moncleanup(); -#endif -#endif - UpdateUIState(UISTATE_EXIT); return UI::EVENT_DONE; } diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 7fdf56e5e9..39665dc9ff 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -137,12 +137,6 @@ Atlas g_ui_atlas; #include #endif -// https://github.com/richq/android-ndk-profiler -#ifdef ANDROID_NDK_PROFILER -#include -#include "android/android-ndk-profiler/prof.h" -#endif - ScreenManager *screenManager; std::string config_filename; @@ -1416,10 +1410,6 @@ void NativeShutdown() { if (!restarting) LogManager::Shutdown(); -#ifdef ANDROID_NDK_PROFILER - moncleanup(); -#endif - if (logger) { delete logger; logger = nullptr; diff --git a/android/android-ndk-profiler/Android.mk b/android/android-ndk-profiler/Android.mk deleted file mode 100644 index 6637e64853..0000000000 --- a/android/android-ndk-profiler/Android.mk +++ /dev/null @@ -1,15 +0,0 @@ -TARGET_thumb_release_CFLAGS := $(filter-out -ffunction-sections,$(TARGET_thumb_release_CFLAGS)) -TARGET_thumb_release_CFLAGS := $(filter-out -fomit-frame-pointer,$(TARGET_thumb_release_CFLAGS)) -TARGET_arm_release_CFLAGS := $(filter-out -ffunction-sections,$(TARGET_arm_release_CFLAGS)) -TARGET_arm_release_CFLAGS := $(filter-out -fomit-frame-pointer,$(TARGET_arm_release_CFLAGS)) -TARGET_CFLAGS := $(filter-out -ffunction-sections,$(TARGET_CFLAGS)) - -LOCAL_PATH := $(call my-dir) - -# include libandprof.a in the build -include $(CLEAR_VARS) -LOCAL_MODULE := android-ndk-profiler -LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libandroid-ndk-profiler.a -LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) -LOCAL_EXPORT_LDLIBS := -llog -include $(PREBUILT_STATIC_LIBRARY) diff --git a/android/android-ndk-profiler/COPYING b/android/android-ndk-profiler/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/android/android-ndk-profiler/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/android/android-ndk-profiler/README.mkd b/android/android-ndk-profiler/README.mkd deleted file mode 100644 index 1897a2895b..0000000000 --- a/android/android-ndk-profiler/README.mkd +++ /dev/null @@ -1,5 +0,0 @@ -Profile Android NDK code. Further instructions here: - -http://code.google.com/p/android-ndk-profiler/wiki/Usage - -[![Build Status](https://travis-ci.org/richq/android-ndk-profiler.png)](https://travis-ci.org/richq/android-ndk-profiler) diff --git a/android/android-ndk-profiler/armeabi-v7a/libandroid-ndk-profiler.a b/android/android-ndk-profiler/armeabi-v7a/libandroid-ndk-profiler.a deleted file mode 100644 index 39479f1653759597b94232d7eacc6c17d087f580..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38806 zcmeHwd3;<)mF`!4yIZZ6td_jWi>z)*wq?uK;w|zTTbAX0iQ_fFwAxZjYFp}7x?5i3 zB_Rt5IK+f(FiChM6A}^}A2AD}8%p-XNj0PC;eqYt8?yHW0 zS>EH1_j~6j^>d)K~Fj!j}F8JGf2l{-R7z{o{gsCvHobRyE`4vWPrTP#uRg(%W-o!+|u0a{$0Fy zVL05faLHnm<<8*gwVOMXQm~{@k30wb+%Ud{IzT-tP=?S`_@wWyt2*BLm*2nTecE~2 z^C8ds@9ijk8qeU_)nNd!cH;xD3UjqQT780XU|PRpmQc@opkQDf%VKsI&&jhSrPV4uB8$NL+z@uOKZcE_?YG#$+(+OBzsa2zu18T z>G)x{Z!8^4_Qo^0eEmD98qhWGm$1C|EUzV7;;8_Nts{WDd_Vv|Na8ab`5D4H5_Y>Q z4$0oU1_}SC!Zouw0E1QxAEH{+$Mcx$cAG&?(%-vRbD>! zw!Ga1@}36Ja}jx+1@a#90epN|e@w^9V?k{mNHq!=e-U}t7KCe6MxG_!3(~2Abf5D9 z<&tixE8PlH&pFzwfO9!6pC{%`Kchk)@B+gyGOawyXPNB1C1rgVzi)qxoKZDFd2Wg1 zy#*oMHAnwqU9ZfSq5KueL5a8Llra!Rcz^`N2RL4SLlJ%52L0uMg-6(t+ z+Rm6u^qcRUn@+S>#>y}3-*Bvb`EWG__B@OaHQk7 zmcDJXvuNfUj(^4*j_>MrPpt|+*!kGhcx>Cxb_X7e{kU`6&(fpB+TEuCw{IE%o68&JVWz`uCZ;+VF$g1B*A8 zMpXFf_S%E{)=;jmqw~Pt3oSVrbQ@0a_a9=5hf#CgYiE?_noqxpP}2*OH%$$DANIZ9 zf7{GWC)&NYF_gEX^9f?@hT4tC+K=nnz-_f!&e-AVO@Uiaw3n{m*T*n{M@m0deCutm zIq>|{fhRnz$I15Mk%p7&I}Y_da=_HEsxRuO zdhxp9M512bGu08+HG0>DaL2<3DQWORxZ^5a`)4{_&XV@xVd{JEzUHiFLOu45IKioIECQyI&#nh|*H!HEEW2ux|)q9_9>g(t@^Wq(^ zhC43PHHP|6zwotJ)!k!0Skm{wHuVDY65{jpzTSaUa*hY!f29YQ=mEyM{(q^=xcMIy z@IwVWrho?(uu}o^6)>IeWd%JhAf11_?98G~Z+!AZ`;3UJks_vY>=|uYn`_4@H zVB*%cjoZqmqk0L zU$b!d%7djdl575A^1b_RX{&s;sl)qXSD#wY)j4Z;ZpX}<9=uSsW!gQYXQ)}+gQhxN}?3)htsRf5RYj28N zlMB&YB2VcX&jdGlYJwXOKGA-xeM;vuuf4H~ea;)t;8{L{Uj~o_P!C`_@?(aE+c4dv}4EG%XY2Zx@I3XBoD{>6W!sSbo{EJc(UtQ_;9R$D6S)HO@%Xq zv95TyCzTGHfqx>|8$K}9(-TkEXJ!Wx>+X)qj3C+7vAsiCYZKNyUq?vEBSAb; zVTX2Jb*&#zR~G>vl>U>n-VStxJYJ{W3wXzFJIs;flX_fyTM?kV_d0;b`w>6jcyIRs zUT?Dl_`I(d0e&wBgGJtQJ*4(|eTifi{)at)^Afx5B5%9drw;C=M) z_*VM>e~}09F8YjiDe7dHm>=+7qGbep&pAL*py(x~CHg7K>)XVXRUqsD{x0UI;T{0~ zFL?pqyvKQYPyxQCzvi$^O;bQI%Lads7x0h$dtPqh5N#Zt{eSNP{8O}RFE6L+%M%PR zO<(?w2~{y{(EA!={2TLG%Pjh%9-wG3E7gBR5m2;-$@zcHY_FfiOD0^@wSt#7)3uu& zihsxp6eTX_Wh-lN{P!sAD;#rAJROAfWQG}nVI@BBX`+MeT{;h219G z7+W5^jd>XT3D^ah7kR z;mR@A8{D#(;+mN2ty1Bvo1MJRp|y10#a8dBMR~NR8^PUDY?Nk$O;31%F}nQC`f>(S zUNnU_;8#p`1#5UhG@V6o4a+^|I<~J(EcBSaXVvUrVaDv|E!e}1K;N>z_5u@GMbqHF zk#hF2+4|qhhQIYV8_QSxK%is~CvTyDbbyk*yyU&Pu?Q&HXEPb}vUe$aop0}wBlUi^ z(m|9QmC)tUG)j(1;PU7ZlpMF!_Rmc0#6!C1rJ=AFD7o5jW#!QWJt#T(9sMMfhd8A! zIc4HihWKcgTw`i-TId|}b}bvDr#2j#O22pQ)m&X@S^y}y?x^PKLqBE;*Wa(XxuFKe zd$&oUxjZ^Fh?1L4o?FYKLur(}$E3GBG>1}dd059=6*|k(zwd(P)|5y451{1zMoN3= z7e1imb`x)NXsZV(x#MfP4BIhD(Vh9U9R=&kxH7-mwU~o-({~2FE44r4vjoPUob`Wa zF8*CPe|^P-5cJ;b2P*kI1ih#Hz&PF~=3C!)kKuWjH4ped%97pb_W@4GsB$F<0~TCz66uKW%cZ{yhpe+;{CS6m+u93mMHr^TX1O1*Z>fENCBZT zJ|=uP`%?&o4C5{DOCVHkm_X<_mxd}B#q_q6T{h1L>?{v$Dh5K$T#qO>oijrJ#3U*V z=M7CM0?NnQj(fKQl#er9Y3L)I*y&f5r?x!wFu4iFZ+z%Hxrv6W41J2+B*RS$eU4nE z;liOo%A9Pty3q6Vn_{^7(6`7| zgJNK6tA~tF0n@4uK;2Bos=+QO{qXb2`3+aCZ(y8rO4SE}>6t_?)H$}-se8S2r|Z-) z`jVYeHA|sxYYYO_b9woJgX+h|f=(&`@o2!@Q&*_j`6fn=a zH8M&ggEvuJ6NS%uTq3dP>dyM7i-Ar?suV#D&lLk1rt@MkaJ!w2O!+oz<%3GSS_)J@ zNamhS4^aIjHkOaDGEIYeSU0FhBK%J_ne~dqR)H^!WUuRsf5?R0?>` zt#5dt6qxJ)i(kaf?z5Ki zeW^ApJ`c{h$4<8%G7-KGs|{X0@m$^<){ah`S>VuLc2*IDuuX9qw4&$}lae zGz2VX4Pk}#IZvNiY7y5an&>t6WY9EAy%Y3>d2FG)Tzs=`|L6HO2A1(D;gj?R<1bMQ zLV$i$l3t*mkIJ>o!7_Fz-16bXORZA-Lcr{@62Nn8SG}(UxRaq)PUk*@G7pPdt8SvO zH6_63DXg^w7~w@z39yPg3@h2a)X4&;+NRDkd{>FtM5(``1h`QLW8!QV9K)zi^&JLd z;`jIfo%*v3wt}gTD4?0aI+RZNH3nhIbSu8FhC#&{6~};e)EOn!ka(ZYD#D69f)uR=u0;;=Af8 zKHTix)DP6>0IcSkih4!6Bk1M$Dd^>>tZjttQcqR*003=wvHfgdhI|h9EN5m@8K{lS zfzPR9h-Rj-iAnk#_9|_Qn5oTdx;}@EtL?wDxLb?^_gC5`Fv?cG$bAkwp0?FYWjnh8 zpToP^c8Cs_u_KUtv@v5lObG5UwUx1N*l8TN5T@sH2P7K2p1`sK{l5(bR4Z zaV6EK*q`j-K+NZGKdo&uQ{9`-22_QbQ8uo`DVthWp?0WU{&N3QZT?R(GoBDiO1Si* zoU)RVr6tQs)HuLf52tL}7{FJDl9H7rtN{N+IAsj5VH{8-?qxt=f|^yzNX0(TD@cjF zD4Bp+r9kNQ_h|a=< zd{kf}-T1&vVn$84%9%RcWUoueltyLBH>)(PD`Be7mDgz{3aDC`%Mvi%=VGcCy26I@ zk~WMpvLfQ-V-Ac{jYRRWu4?m9s8g`Y&(hT8Q}FnK8Tl|9#^poJ%xB6I1ZGvKmT|nt zdrS6}@Zm;_jy+pn1c5n?s>Kz(VW9+=%ZLbLhakrVfUqQ znN6C)3Y-el;JdFd4Jx*%(P|s)TU~-lrc68ZwNRN3^)@F5>GAj3FpO3Zjw}^AR6Z)Z zT{`*9em^hyl2`gYt%+lCD+PVXw8E`FOj1R zh24a^O`+M2EU_6#=m3!~0EJxys&+USI(Z*2OpbOjN53>dtOT}!$tIK5i34Ef$913I zL0u~2M4(!X$~R*>0`;IJcP|$zV2LjAc7iD-M^ZU*-wuv0JUCfLj&opJ8czI&g~1>Bntm}@qb3fQaz+AV4QTu}$XbsM;S z&62n)+PXP7*Pg5WuLAhI7Pm8BzMVhfZsX|Mv*S(=F1?R=V5xX*WAU1!LzC*Ixdd!H zKXiM{#kIVRZ+R=j^0tDk9EF`Wc{M7}Hlpi}b0b90^z$u{POG?Pk8_Wm&IxC8V3{49 z`}k>Ax@lVHK5jwrsq%*>m3!8`cj!M9hV^yp3ad zTNgIopR53q`|068+=G*RlyjulBe0#oF?1;g(Nd?!!Ty^2IFhD1L_oWyQF9+TZqAMl z_mZ9BjP6L^t6Sw|gb(PXhctfJI8*o+&1F7*?!D6nV59cEoG$~TAh(l1y*Pzk1a1*4 z?4%YO6HwSixXZW_SR{p9Czg-ClL3uy?%vJJy$*Kst)Leju#1_{lSk~PCWuLACwoXn zFG2>Z>Q>Fj-5hpeX43t51;AyS%&|;1KCmU8$;5i&dUb}I#Cy_-Y<$6dz35^$jm<_e zxB%f&^W~yKek)kdwHd*v``%Y>6t@!GjK=wLpeLOg$l$Nb0nTH-p|L+PkjUc4@|U>AH9^q_ueCUHEDiDWa0e;gYs0B#XSlS2d1 z1BqltPf4^(cVZx(%p_7toUnm%PFBzKy;_vsr@u#Ea<4tw$G)5UyY9+cK)qn2Z5!R3 z>fN4Bq|%A(F;JIm_15+s+cvaEH*Z@P-L-Yo)@^&XVr_wY``V7xyEgCCika^4yVve$ z+jjX{-PYXh?Q7e1ts`Y@)}8u2%zbOVwuh3LL~kmP>yCRd_!E~7+o zlB>N&xpKCgi_ICS&M8+yZ9chR!)u)ZPMyi<gkDQ!JX`!(_o@I zn$>zSIj3x5fOW;Ku$)_FNK^}>S*>)C^XTeNbsdUk!QJniBPFDxS#V1;=Qxz;);Z$t zrH#eiK$9u%g_^u@?ZllNcZVcP+`+Z7xkQ~w^k(AOXcpX5k4AYPWBonJXcpX1*AAjQ z63v1OkU0$!aLbuof7WPtbHQIRHy7OHnm5@C z^bDq0JKV2}M)jl4?XGAv)3IUmTD=*jFSu*PGEh2KKNGq@!c|Vir?MfxJ7CSc{hAhJk0Lw(Px*urQZwuWc=wA|NOe79vN$j3U z9F>#!&L;6CXNj>nGvHK*(*e#(s7_>wqk4|q8OF*ZaiGeTvzf9oYKcQ?JNckYzDaF< zNPo(oua(6BmI7EVY4S*drT?lwyOEm#J@v3}!UwEym^DWG+T~lE!@uvk{5j$%rMiZw zrn%`qQ~y8ZDiZEvuYR$U8~?FG7NbsHq+7e22K!^#o>Y1ulk-{7!~;3=V(EdVp-j3d zk?iUp>W=?c)5)e%{at;rL^9J9OApNJPb7zq&XX4tkFCsG*toc9FdgSHk!+LkKH9pt z=|Cdc)Y#b6pE%Ie+tqdPxJ``ve<+{--uh@7h;{YxM9811{+nW%fj?VXnPZthTUxQq zz`WjgGM-L!{n^sg&FjyWnzV8`9MHvCn0a9}_HmS($#!?gdm8(=!V=9M8;oZf``GDb zvfYVf)`S^MWfDhoo<6{a^SfmET-QbVnlG%zKFwsi6TI}8cTi&=yIHO3*vI_n7fx!3 zsVU?Sy%{$D&S~spBKAFFeEUy2C*i8wvaZHjEFjzl&);hxC!=6N$B&hc<gq_% zrrJn#)4XN1kxeUCL~3g0);c$yUS8|nZCaej{F zy}gl5HO|AQ!p_So>^yX;vD*2LYOHY{Iu&kea=xt^_ic5~pIYv`pu#R}biS#w*VJsN z+2effRM`2V3Oi4qYIMG=dfJ?~Hs`aa8lA7JYn@M=3OmE9 z(J9M%nqBqqrbjtrm6HrRW5Zh(ZMrlPX{w7*jjOp_F_4H+ni`=RUc4A5~|~NXRxwSOr={ zhd8)$PXMXe45Md^Sb89uZfVX>2sk)T@?_xQcv?@r@&mkR|A8Joq5F^Z^P>l)OfWHs zXeP#?s?1PXknKa+mc=l`W|@#Cv*}d7DZ8i(GwXw0;OWzD=In5cW72_CcO3dKYHmIn z?MkH%CE|!4h$VT>Ne2IBbj_4G*v!PD1F_7Z{6t|e9Y4$s!(4bfMwfAIPi&|^n>+O? zNgRk};*u9VSsv`N3C+SKZ{Hzs%!2KOnK}8Ioi`7>&+lK80$uV;y^Ms5O>e2 zc`ElN<42_)d5)L!9;&z4?kzX{$d%RI-s}jUHPzME->sVu z=kj*co=Nn^2L`jpC{pH?nM5?6PA5}Xw`JSb=+4#aqHS%_HQRP=-HD7{8R+FmK6^OI znN&Vy3XNt97B<*Wx&||8ootcA zwcnA+Eeq%d->h%QU~cNDXDZrfaX$AuH*8rOUBBV-op$EM){u$If`~gcy8w`zxbQ~h zDms79`E2DXXU)3k>K$v?Kr?aHb5A1P-<^^9U+$*piBU8Q`+U2WRiZp9Z0@ISC|OyS zVLAAW3?{lSy4<0sZoILBDOR0*G|Uv#rf2&RPGD2XIEK1d?OliTgDZ{B)L4sw`34pk zSZH8TenPHm_YwoG29_YolLm2QQ>L}LR;8F;qE|niy#IV!-8C-D9r<}<{>98oGa=3| zTI3cEy87Z>hvZNNWVI^Si!PWyDh;#HLf=Gx+^(g$Goe> zWS%78MGkd<%L0fV=s#p0vBOb59gNwZHd!CF5|WM&qz=amPlm9@Oz)9NuvcVT%g7R2 zA{*7`PV&9HUOaIv&_wyVNDn2^pGY2}D2+UYz9zh|adCKlbIbhZmgdFb`oVNO9q*6F zGV$4?D#I*xvG2+EJbF#Cl^qoq{SsMbDz2ybxruxx5$$5{9Z#oIX>)06oXd~ywTYoF z8Z9s{xm16*ZW*ki9#$^fN-|aOmSl7;f0?poj%A{Q>BQk!HZH3z7g@#1#H0>+exLbh z?BbJhJdS9RMR4DJyBeq$H1uOL%G)j?W-_C0%V0K*c(R-Iq@O|kMi~{+tor31OS@t; zdWkfeiN_D+)@q_d%v?4d8;mAXFblGoSTr5aWK-#Q8d$ex&C+oFx~;or|FOF{KW{gI z>LCSo6UKVSs|jk7Q>iAaDW0j$bnjfH7dzg1>#esGJXe>Mj?s%EmN>y*T~>aJy4G`z zbH+Q$kBc0C$d3yr+V6VLb);Jw~=oqtW)dVp#*mbh@! zR#tb5dXML3=O*vFeK-1VD7rpyUGeI&PPYvKF6^|GjlV_R=()kU-g})sMg2!?CcMpF zf;FPhIC@21+fj%g&BhMsD22X^MN13uqlxaLe=r0SYjpQag;GcPT}0;F{Bsgrz1hWt zy1oB^+`=GQv}=c~c zjcK$rwz%zE{Bi3S{i!Z@;K3n1tjiR*=}D~H%^J6R#)DQRaVuXmf*Wq*^miwz%9R>!zYU!Cg>8T#R%-e|9OBhFG}J zX~S`I%)JO|!)g6kSGo*m7ZFJ|9OH_nu%^3qn8n&95{BWJ9v6iv&*qmpFI>E}WaXLt zK@4(NkaV@gxBeEn@aj(YyenO|Z4NG=y30YM1Mc$L{LtMk@3|c&-z*2+Z8>-r(p?Vf zmR_tJ+_~WfgDnRYL|G3u4O@=Ca=DRSaFv5{ZMy$jP!8_Bx);5zJf38*X^>uX$>Tz~ zmB+mtcRBJFbqvvuL`5-oIT()Rpe&M2w~R-9#7)!XX5pUoN4p|6-R(wRu05Bk{3Za& z%4;c*SAMzK`=`8dE_ody&)&zM*b5?zjERsz(R*>%Yo%wRmzL71*eFf#< z4vyW#aLYSWAg^<$v1Pz=a8tv|qb9rie)Q`XWS(p}wBog^T`?TXL0KeQj`IcSzOXA_ z4)!TF-G3@52an|zZo-iMu0Y=KE~Asga#XqG{kWhU-L~TrvgJ@(LnZ%wFdWN4StMJI ze=A70a(BKQ?2l|YrW$$Ru!_VZm%K-oc**}p31_J!0KM05$wuK>e|LMX-wo84K$n+# zcQ)On1@b;K8R)g0tE5TVTo5i&1^kp9m5@z$eL=e0W57cJlP*;pY`Rw#$P3PZ-aoZu z*%=^Z1r9u>xT-zbk-ZC2j93gm5@1FW~gT=l|} z67G5q9L%>X_S0709R>34oCE!AS+eV#(g>*9yvez8~6d70b)bPg~wXTTw@s1OMvkdu>`o zmopw+4}7@DY@$*HgYvi;%Q|*FHrTu!*yM_6wBrLsIF1@a1QU6mI2yGJsNUsjM_neJbi9>*RYl8m)9jm0UxG_mc|Td2%qZpnM!L6-@5#-kujU~=W+PjT>aJHEYHZe_}lccFe{)&mvx(q zr)nI>PFCJu0yyd7-Q?M8$EJKToGnQN@Pmi7Pv9WcX^Hc6Isl2&Nqu(SIJ5VO;(kSKIeK z{oUlao*a^+Eji}N8TF>3KPBbK$yrh}^k(^mx_((7hWG}` zlk+y-{pMqOi*RYK?U;I{)|e&ArRujO@>dn`rwjNy3i$hFyvwz+u^6XqKUtzYj@K=b zr|PvO@;skvi9D^9SR((;0^TZ2k?2p&XG`RNR>0FX6`eRY8H-Bre5)mf_viW^BX3dx zKfQpb2?I-vzgor>oHLB|RONIH>I!$5>blXmc})v{nn&#daM8!T#u%Szqh$Ejnt8j@F{%wdjZ~I%bQG+M?sm*RkfexEH{4+g77D zfD2f=AFP+z&90ZI<=Pzp*_X)e!@0JRjDD}(Jfedf}1dbxzo&BUm-uNxgo z9!Vs-qg{i8(ZO^JddzlC&NtDWIGpF)VViT#I*e-tuqQPbPv+GwxRn-99tI89rusp< zRjDp*l-RYW5|xd|Ogw9Lgxotx1Mva9?^$TGxX0|~Ma{lew5#t>loqu{IrI+2(%t%g zm=!{OQYzSG`a7rC^mC33w&vLRakuFk=aiU!FDR>Pb7)kRWc|k)<-uT&nO``LQR36b zIXQQ+uj*d&90U(SzrBNpptaeV4=R%f`^{0|;DAwJr#la41e50cO|Zxu2O|Gzx)&Ke z`ROThjGpQLPYKVypZ>Jp8BEazlR?@v3=RT|iB|y|iCus;71Rf$$)^F@x8adi>aRKx z-~&XjIg8@d0DnO~2z;1W3p_xqGl$(-{zu8rfL<$LJoZ)2OyJXk)N!Rd&zR8ti^NLc zIbzWCRn9En1@ewLAw$&lX(#f%=KaNbqtYbH!SPoxYZUWY4xXxKJ@C*G{i#OE`adJ? zT*Kpir5OU^_lZNmPly##pB2D}@Ils3+#Gf$vX5u@8^rxy;i=rqcq})OTmY>%>?{Pj$u9!>h+d$dxEL5DUIJvr{iq<#bU88@pF`uyq+T=6n_gs; zMVT(^kMel1(63oh-@E3t{oG3=8gCs!S@St zyiWIf1v!Q!&$U|OGlD!0L;mjsIqoJ;vuH%t3z23#hAnkRP#1uwHP1;7Y*_ zg0u(8@ElJQY15QQTX96TPvSX2KELEYD)^+}GlF~$>CZJcBHJmE_9=-qg3W>}1=$Yi z9}_$-_-;Y2wb1_&!A}W(N${J3KN9>WLC*gf&r4%w`+;)7TEP~<^@6kx#Bj7YK}-vt z5qwbaDZ#%Hd|B{S!CwioEmKZ~V7(wMw&`>PQ-a3@Zx#HI;DdsHBlvZ}?+X4zkj6A9 zw}__1_5(`=*9&$FrUlOk-Xi!Hf*%w7wBU~f-w-UNBKCe@ir`lTza{whg1->_y`X-# z><23Oj@b{)5?mlin~HSbCiqUlgMvo|X}W>oo)P?l;8z4+5d6NNm&S|s1Cs@32rdv@ zEx1i^zu+OkV}dsd-Y$5*;1hz+3VvPi6~Uhh{)?cGhL-jN;{+puO@b=~Hw*3+>=Dcg zUMqO3;9m-!7kozWCxX8dEDD`@RZ54=Wf z0Ddm`hWOJ+2-6J^`FsgqDSWN)^};U@zE$`&!mk&8k6>KzD#4qHdw|=B4ZxkmD}nn3 z9~J*kiT`KC{YBxwCHxNrUl;dZ2>x2|H-Z%*lgYKT33fCxm~7=mnk^ z{HD1758;0z{2RjmN_a(M#k9#w+z*TuevWMg16(cq zyM;e1{M|$^aIf$m6Mqu>SFYI+xxSbCR)c)=gUEF`B8Te4CP7+4BF|IQ#0`R51bOC} z?s}Z;Gv?peKljr;Wadvqo_HqmU>T7|xrto!CEh7W199X(CP-6oOKn^~v=W(nUQIA3tFpdPPR0d2z5$Q=1yg8K#a zIKIlv6N#KB5;H_E^d2jD?#UA0Bltc+J>IVZJ}CVCf*%!pOz=rTnzLhgJs+qtmg|Vz zizL!+9r1O+|0VcqL7L2>f3YCV)RC_etP`vkq>(!I`^yB^2(A;{CV07^o=-FYeZr>% zGlH~eNB?sek-tHZ2JFb|`B4KvJFY}MPig=@E<8;-lcz~L;ui(A(clK)1>yBPssW&VR-&Fy zH2|*(PfK{@e<$d09z+Y@#0H>Lke}wFd!_Kx1Zl>X?)AdY6i@~`$FNh+35!0QgNp_K=RuK z_Xu7octEg6kY)n;{y!#ojo|fyG#N<$y9GZi_<-Q!L@)4H!hc5aIl-?9euwA)+qDmYGXk|5W}7>>4qi8NtITqL+$aFyUX!A*iY1a}K+>zB)c znDBjq{em=dPyZu=dY-);xLNpfg0~B5gV4)?hlGDz@DqZc5&WFsmjv}ZeL2iLeL3)w zxa;-2T}BtrjojDaxPtqPeE)0Rhlyt2ko`1uT-YwOO)6O*WH>$E37P#;q8|5z%z8SJ z`OQm77dYBzlbz}L*%+NQLigD7?UzYuKN?I^GW=? zAayp$>v2>A^jV7<%J{fS#=)KW`%F_nGzooXMdH%wG@Aowy zrQJW|zopiIdbEDh+wu86XZTC{D^2wssQ=d&!yV7O)~dg%qr=;8lWluf$9v8PI&Lyw zEUJraiENwMakBk%`?VcS!}Z3scJ=g|*B;tA>lFeGaVxr{EyUk;I<_l zfk%oyrf%~+;<>H(5q{;UJluGJ_~lM-hrh!&%HOotGlAhXeRsEczjI3}Hr0@DunwuN=1i5#c6q<|qO$p!4CeN+K{HBEOJtn>70bOgi@LL_8 z+EoF50?YTl4`^;pF~2F{d%uy=9=M6A-)`b<4zOeO-SJVK&+P~*x-*|8S_8}PWnCFp z=2yFxaI>|90pa&f*8Yso5*UAS)_+MZKBq#)UtdZ5WBmLB@37yy&%=+v&_oz5sOUF~ z;i&+sdBDdG&37k_BNb6IuiQU|Q=0($OTURzi{kzi{2?u%)?3_{fWO=@fdEbE`z!Qp zsJ0Y-@8kS*jpFQ6(FAGUx(z2b2?!z^@vs zWeoUL1&m{*t)S;?taiVbUmPsu-Oy?914%l~w@}F?3Kil+$k=)QqZXI*rjwn#b!D%y z!|Zb#S@v5?%0;6MB?m?uN-oY@JEo!JVBXAeiLuCBYOEcPu~w4HtVQHd&dzR$+smLpcB=OfzNWiFCFd@4N1mJ+EZqQDOuV2pMiEG6;{ps zNhxe6m`FLxp`^D*(nc0tk;KR%fe)&}c7hRQADrAr`V_WPqVdg{H|4Pds`e{vC-7uh zfhAzxwt{*y6@3{;J4RhHXB(1KU|^VvHKxCM$P0{kXa~`L2%UXl{$uET{@J7<=HzBX>sGm=53w#9Z-(Cl)jKmX-70d`VeD7wk>- z!D)7Jxx?Tjqcu)qJ2zxatg#i4+@}aR^5%2H`$u=S7Ut7Zp+5(0Zhz7rlh4mac(i`Z z{|%F4|Ie8M`+w9lm+OHSt5w!g72EG9i&ReDB9&OKqOmETTY|PM1#9K0LWLudn#epF z8JfNzGSB02*%X?lwp7*5tEqQ}!nO6zk#Hokvbv@^BG!p+c)B{$R2^wqxw5H=PELQL zQ+cf?;1aM*jW?l}`&TqG%(O*10eOyd&)y&C9&$E+2IJ`gV;CqOlAVLQBQtgg#G;8< z$I0~~Z|ftiu^VgmqTiUi5j!=eCozV8q%RrOL;We+6k@DJCqF8pF`IIc{**Q!a@{%& zKNxLR>BhT;()^05vG$V_sJq2{Pc1#2?d5b2_a8Ktl*@tGco6Fq+6D!!+~i+F1>G-e zkHcSW3fGvcFvf>6=!qSQ|KBqL!8Nr%WCMadtJ{`?+fD;}^NZSPXe-m^?=9)x{y$}x zAzxR8hyGnY7diA_;HwP?yzi0sc!i2;5{> za|&$`a73B&bX{^-s3&M5gyHPyfn)}GW)$N-qd79o4D_jg%5e?QQxU> zrK`X4tIU~MmV@rL z9L6$xz8qW!c9X4V?&rJ9!Eh{xO~aU5REo=sxB=L^cg^=9|z(AKN53!l#) z*PGpB*`F5VkKve(Jw<5q_YVd68+7H5^9)-r)cdAvdj_2Pxb(L~KmJo+*XDu5#RyJ3 zELp$F1!vFCR6*;=@_x8&5a>k$8yUc`&*+mvN zj=pVqc`m>e9gB*g?RHqQezcL`zQ3(Crk*L!o+V?w^K(`<4(VORK!eM{Uh*7*Tiz;{ zJkAVk{&-Ho#vwfxG;8&itY5M~-ufCdvta(%zN|c2?6z@8KMb0^9!u8mngV%!HD;}! z^4Nb^d3P4bTUlas7%W+N{H~|FydyQH-YAbVAS=(F1+!M3#7l+f5Ei3({i`ohP2z z9-V*Nn;LRp4@OzOyg=UQM&{^KgF?Ffy!}+Sn|OxXP0mHmNV|z=qTTfNGsNyU4BLl$ z1VEloV4ir!*G&%Ubcyn%azAN|U&!ZAkCS)?mZyx_#+dS0k5@kjmMGVKs+BxHWx?=# z$B*?CW19^u?cBYD$MF0_ld9=tS1Et~CRDnG#H zRqiZc!4bjy&^eP$b83^xrn?3Pk;!z$l06uZvw*$vtUe~lxnh6LIICH24c3d1emNGL zJEJ$-=mG>Ac!C`oxeOPaD`)BEnZ5g9qgn4HQfD#PWcJ>9u7m4cjx_8!at6@eh&k2( zz--ZFm?F9d5jmq2kuypWIipl9XOzNnMroRyQL2(X8$_*x84(@Ki1}m|QJ+nU z06cC;)Vh}uAS1liEr>v$$0ust%Lw$>K8XCz2T^ZOM$C>3@$2ILBf$w=%#4^b{6wB- zCTbnY2ymtF+$trnbs{6s?@A)yT||9mC<6R<;a?T}mEd1;=k^6_$LLm&RzsKDZJL* zV|@yLju-(xB>abk|CsQP6RUyG3I7G*Um`|ebnqg;Lhe$reu)*p8o_PizK=K+c&G4v z!XFmYI&u-HzB{a-SLB5&2alBKHu8F+trPebOF% zqWj`A+k-@YTaBpC$_35YRiZvC7c^&BiCPyp2t3B{L1~{s;0wa@;}hgLCm`xGb3tR9 zg2=OkM6DYflrwWd(G3m)MQnFLX!{04ts@+S(Gd>HnYthlk#Jf^g8!neKD+NwO?2vYn-FBFB=QG;Z8@%Ti}+lh{e>>}!)W4YDlDmJ-`?B{@se zwCP3{hSJcz9oDk6lqGaphJlu0mWKY6>%V z?&XjByYDaY^Sx(z&+?sfzO%irqATOsMC!6&dt@qgE?Tmzt8?*^#T}7IhxT&+jYK*- zyCp(@5I`A#PXYd~6#rlIW61wlYo%`fO2Lvs3yK`@s$qPKb$}Msq8g#6@U-v2Yu3N^ufKcE`;7C9 z=Mm4_-?_f>89e*h^=sw;h$rI%X{hM{d`ot(gWnraKz|6W}MWztrF zIy9D^Qj}dLA3hILc0wu|jYiv}O$3jEQUh8P$y>5;))dp4a&UDF;P8_Z_XgA2z74=-e;r$>@mY}mRdvSwGLtF5aO>XfQQjlWja zDJL*HFfTC8r&9#N#niejY0D>%<fq`uD zh}$=wjgJi{bA^2U2dELyb?=w3eD^G`C0pXz0LrZ+fCqg*06<9MGaUJO!aEXnyDJXK zzP?ro|A)eLut5OhRt)7a&z7vb)h^kjj13@U!|gs#xJ@>Y%a7@}%lmFudD-o4c?Vr_ zNS^{QbRK#ACGsBg0THP`reo!?pf<0hhyvKRELp#sO2Tz3BhM1w1?l>dbf5D9HIi!7Av!=TXpo(NhMUx+h@d(4Fm|;4klyJcXIBfuTS2P3XFG(NgnW`@`Rat1r_9 zDtr@Gpj*EMw)sP+oM2ErrpDKf2P?~~ZyNurac`4~>TgbW&zuL>R6l#Zc->D|Z#vOCJB8Mn=PEay z9X-+8kix>6vsb5ZN!8hhQ!k`W&7usn_+NVWTJMXiv9P}NcD1PWRQIzS=Pr>UV3m@pa`ii%nIo^A$m$5Dm^Y6Y*CwlASXz`re+jqQo#pL?bZK*w*ald-NN$uWv zU9ab!YkR$sXt-5}-f@MAigxOeDu zc2A}-sOzk&IWo}M;`!F1O%JZcx0(mKHdi*Q$aTHZL;HJJCSSOJ04){g7EXyjnWoMuxZW}fqPH%?oTmH;PLXiEADOzdm_Pm$=7c}(}~_${Z(gv_UvcZ4=Es}fHx`V z@n)lf{=ZrQmndMa0%j@T*8u(z!0%oIJ_q1QGj7$~1>idQKL%j++7PaicY5ZD%2Pjk z`mQZ^U2*!%$=-#jW4*1Zkj}qzpErya-&yAvTD|9P+k9QGn&jWxw%)eU8@ax>Q{E4v zHBJ7Md300o zG1Y|m!FxQ{Y`EsOYrc5R^ynh});wX=;+!4t>kc39y=^kHIkkR9$927lRM~iK_|X9q zrYx*lBIn*R8Ba&_J5piu#?dn4+n-^X~xQUuQ7p~Rt%@PT^MYWQ|K`;PZQ*LcMw9!?y3q<;1t zxCf7*^>5FqOVvYfTl>kEOlcb@-;*k>mpjg-UTF!}cPtApFXRJfuYYB9{ruF-C3nBl z5%xU9JfP*{XTS7{^HAvFiqykvm2TIyx@~rN0RErl0qQ-#bou`)1^xejDBy<*__hLu zM>AueQovKvme(p^fdVR(X|JR+Pt=?me|qtz6TP!iSTJx-%?FPt%!iRglSKpAD8Gh?p@42f|s_Ux$izcUq8}7iuY3F8bY`){#UbU$1&}{GQ z%H|vIS=;bpWz$tX@2gi$(f)yc&+Sb&I;W~9yTXTh-djH-_13lDIkzJ<{SMW+qyNG? z!Z$j%PrFf_3QC_1Oa?ZU_jz>xweM#9+2>)($nQau%!@fQ*JVEQp;Oy;Zd>2Cxo_(R z%o|)DnU_QRcs7%0&m~8O+Rb7ITQd# zpmnkJJJ;>lvuNm`x58b;TpO|JV1HF-zlc~i~=fDr8ltW-xN@FzZVEx`9(f{izVE973c2(6=D?T zvRprPGUcFmh6kv=&I6nZE?~gW#brRSmEkVFH^66p7Yee?)Q0sn%D#a`(9K=(trX2`#-KZZzxv=1g>JKJk5d7WdR^?fN_kZ zZ&H$;5eMR|{?I`O2n;aG%+wbcIbk#PJOvM)G@{^dqO9bHJV5P76yOckg&d%&n_1T{ zwCbxY;dEVof0Q*i<5dq(7YKG;?f{|7y+Cl$t&;5@`+(r$L6dFN)dVlSi-D?G_U;cz zpb-jRW;66_%3RK1EZbG&Rxl6bwlM9LCS)b1vAMj%0j9IDpsq4_`Po7iR!_;o8p(o@ zw^rn#ZhCNCqu1to{gfyhY?OLt_6qyjxJ?u6%jm3EhCagbZ8TgB>b$`%ODV3Mx!x)j z&bryn_Z(VB=RIuoo@Ug%7rinR@d6ds8Lqk}HZX*WlmDQ5LQROv=!)x2y!sHkcEydRCc~lA z%-cP1GxaFAUT0-Ar3b#J0xl2N=jCZ?9p`#`?F^-BmO`f}J zViQ?Zyv3xqGPHnF?s{CuTOE2UOaHdN&|FVVY-9ixZ#PnUL;vIhD(*A!Hix!)fQtK{ z*Jap_3l!a%PdiYsu8b@5t6j@EkvC&!(0iHoXMC2x_>;5#Zz{xpu;8zsm=J>Aclv>P z_J^SNdOt9Y?}_==@7-f~zGck={tvQb5BPmR^?e>7P{eBhoQn@Bo#w z@0Q+M-ORzMa`8oFK|$j-=PJsBBJkY^oqE^_8vCNC?6T^2DZ8;!+AsN9iY1TecCTzMgcOqXpZ5Z zvU~+D^j5cU%<>-P28;I_4nMws!NC&MFS7-Qs_Ftj=rIL^s@YB0IY%-Gg$(1ZNu?30 zF-#zIEw_Ve8O4mYlwG~h2kfp1Z7K&s9o&PcF@rNgKV=fNhVzDIl>s$%cHq9!0cxfh zt}^sqFHoaDRi5UW(BtH07{BSEGvsC(u0HhV&b?7y6QN#6y zx+$~Ca94z0<7cedaGOK-D4=Gp;kKiC34oE>ns>6w+WkPSR1!khlB=VKr`a2Ns~4!9 z#_t%v0M%tc?euzG`_n_erJqz%3PCUH-+z*hGx<1cw+~RaDfO*#V0O2Mj86gKh5@KM z>DVxyfYP0xJ%=mjS#M^X(@M1jfjPPKFw|+b*V+5Lbf@d=D*ebosgb2n_p}9pM(&TO zdlz%tCg|mu8}z=foPU|yS)b-ceoU#WD0ToU#x61E2vm$YLgXDR;BGx`I7fBT$vix} z`G}yGAO2bOoN=B}>VBs7VNN2SWT(Zf-!SE8l=>Jm$EB2dMh^?K>R9A2EA{t`5n#)I zp2>zA11#iMbRa}OO^-QBaXeAK2m(!4GG0V6EFzzw^Qg|5s;>a%3_*?RhXJV3e=_3_ z$Ce0JH0lNua*Kq#!GxR`g1SK$c?{|X_9e{v34;$SHOim^P{X!LhWR4U{B!1l6M*7g z?RzVLxpAngn00Ol&mGMTLtVwJ>#etWDVA(P=YcdAK#H@rN?`5~)C9A`kNdC=@Ia|cl!YuO$&p)TGK1f0{}cL58&C%fIf9A^Q1vJzqgLOF*Ijuu3=T44wTgWI28N7|++9**KHc>>jfF8Ti|L9d~(vMQpq40c7d?>f5V;ODx;^Ob~dF2e@RX1X%oB z5Ky}SEMaGusem!&Y_@87GzdK90p|0K(1Y7%>a$Dh0WAJ}CEz)I#p1J-fZDzICC%<* zWnQZOnVovRIq$pO13bsF)d1Z?gHRXimanc{_7pqA0^PiR=>e9#z;4*8`2`NJjGG$j z62(Ht$^V#A7i#}U9boy_DYZ@U)95+9efdT7ZZ|z|_cE>?)h0b!y~x1)TB^;8y}>#C znHyH5p|)sIKX-tY?9`m&@ytiHt25QWQl7)Kz7hl$(+8_qJM0(w+@({Mhk(miL#Eye zKJ(Qj_PLGT?I$IkK41CkrR*?^?+h}}JUIeZvWsv-@!d>(nd%4ux}R+D0xj$(obX~L zN0ZO6dob8)b!7;+xVi%HjHAU@0gN-$syP+F@A!>j`PZp8Q&>+0@DPP{R{-bu&|U#t z$RmZ799y^&JWHwD)JGUTQ2}i60WDWm0R0TMiiuyRfIBI+UwxgynD_*PF?BAxak)-i z0Y9U(^-8Dw83tj>T)^m*oAg@qQq{{Bc#UZ$?BbjJz}+>#YW;b+M)CQuA6U(akGe*W zp?CO!75U6KR8HMr1ANdAEX&b9ule7Q*DYm2adp61!kXLJG`^`m0bmVZj{27REP%D# zP*E?bzvF8NdO3LtdO0QQ`4yX{UZ?oE-9N2gXsAi7I%wr;BeS8gHg8fEADgHr+U^fmF*k@d=B4c&tW?3 z;3y#ZSj&vw)zd1R>e;?|rc~cFW?_0%XJJM$Dln67>@XKF zqb6MaMLOJtUYC$rZOW8yeq}^g!fc-_ui**>G%PM;37F$^F^!8|VIxIJebbDrs5tqU z1LM>rQGBec=3*3HBUtTcY33GF@c4mw#V~!-ilHtlX37%;<~OKL?YpmHe+4@?I(6)e z^+OO?&?W&)BCU%hz$F!mLV<;J0ooV=Xs0~386&TwO#3ND&SG6Lt6jzFAiKz& zCzfonPBaKCaryXwr4?$AAGoxTh;P0tk!~reuTPhBS+N3{$Z{7O1Xj2L`+=3NV)&Sa zRqmAOa2d-Rt^h7~2L)D3(U__qSQ9jF+E=T9wL#McG}GfMG`}k(ZkTy+QX@wd4^Fa+ zYSNo&?9A9sn4ur}Ausq+ioy;;oe4-_K+lvT_NnP`IQu>6@IHo`nhvw1u)`)za%Y?q zyHbHBO5u(MgX<}8Q3{>(SOrd1G|`E*a2_WI+3D}H;TWwX9MhwdgY3)tfu&T%3~<)R z3qwA0($7a8)GF+;LOHs2O^rly7nBw4!O7`F&h;Fee9lJK0bQ?)!>da=rv-WffW4eW z>nRxa+Q>Y6{BK%#$Gdp$&hs4)Itm3|05do7VBE_O+%YZuN?yTu&^%g6Tv;)M2jc{%>J%syAO}MXru;uWIfve6qv(;12Vl~?7qX(UZ%#qx+#7bZ-5ji__aPpfr zd)TUgol-jDXZaPy-scoBX&!kl*1}I|v3hJIg`(cqi7}u|e4V2H8Z0nE&dG4WbrF|8y1Z~dP z6KuiwZ1d*sAvUZZdLCE^Z+RQX@-{Oz-XAPI$=wAx+b$iE&G5VZA^=~R+Rqu2gOb7y zPMbLpxyETOE%h1~JGuPh4uQfh!Xf>*laM#AcNPYu-5i(RXTL7-hwOrO04`cO;ml4b*+dr)_*QL@t z4#r1nfT3(=G>6aB09;IbRpUr{G@Zv}4UmhCWR8v}@N@l~N)M;T6Y$j1gSR?!>1&gi zMmCqe7IXQ)jh7`lKrRsjLdEm>x}z<G_U_!)*Bjfs zZ9{C&)=gWt?cIuXCGNfJ*00&KdAGg}=?;J8x}9sc?OLbj1a9}sK;5dF~v1&_o?CUH2H2hX1ij+Bs%<-tS6g5yMbQ0Iu}hc*_^<4mS_8fo&v6Bu`LJfD#) z@eI|<<|c72J)BGCV|nmcI~LdmIn_KbLnAy&zf7_^30d)1%}2mtR0@1#bUav^S~(<%dPL* zyiOlS=?9)0u?&>X{l~N}5IOE^q8 zzB|sX{|U=*3*Is@j_79S<>$d{pBdsbo5UG5$pK2{@dfZ(LY*Rx#PJ%T3Yek=)&RTSTdVV{L#|X&FhbrnzVAcQlH?>e)GX;OL2hB z!Z$CJ6X6bHdvelR_jH(|yzx%9Durw_2<{4QBO*K?VE<_D)OrJ4L- znvWjy4QWepsje>zrkEf7!N^Q7HHD(8m|=_GjJ6aLvEK>fJCYf0OBt;e(X@IIDiUps zPI!D!$~yiMD&mYp8r!4M#;7wRvgvZIgJr!>E7k1e_c_%OCmVsstNa`Nm+jXNZT@zr zV&4>DFDTWuVD6^j_RFJDXXv?2?VH*+JCUL2oTkRcrf9UOG2Gk~-PFFnX@C2s%bGUN ziFT}NjyAS0T+!UV>9SSPrjDp{+YN2atx>PX`NRzouX4VONJo3eR~AM$&xuACMxE(x z&P&+nX?K<2gC6A^Yio({k8`YTlVt8Pr)r;b^9?sSb^Dx5#HriYxXO7I8;AF|?{9J* zzrHQ%d_zT?$FGk>qxx}Tt8?c1A?K`$IA^YpIA2rw8$0?s_I5bWT;Jw=LFId+&O?m# zkE(5AnNDM+e`ix;V@G4u*%om+BbPVLX=-nb&JE8EJEyPT=lqMxw>EFM@3eDth{5+d z$5-lT5x;Z6N@v$bGB>VuK7DNk2tA_^8*!erbV3Uyr;ue!k>GTQx`d~WYgu* zg-y|}Xyg8_#%Oyq8g1I|%#Ao#N4i!yk%*Iy^fpEtqm8RNFKeVm-9@X`HqB{|M%(8d zY?^b~W)GF}-1D%h%M!Z=DXhPEiPX$UY{P=RN{ZM7Cpqqg81MMP+_*(NI~vP&b`&S( zoFtD?FYZV(tCv8*EPf_i~UqI}+#Ia5OWRgjU5YtP5j_Oy+PpiP%7Vj9NZ22{*G`rp!rS zE*=|==MEPq?Bm(w5uTnE!rQsB%rA%H6C?S8&Zi_X5YHtgFM82Bp0MRv)P-y^H!+e& zE*H}^S6qxtS!CFWYHVmEKAb~rJU)n#^uSnrH0fU5Q0ugCsoGR)af)4-uyWx%o=A@k zCXY!yQj3-A4_@@J!&G4zP$;Xrz1f*IYbuc%8Pv^(Yic`t&ZUQwqvQGG6e;VwTsoG_ zX2&wvuw~oU*zPqOVr$pNdbaJ^x*IvWLLcUgI)5a_6-_Z^3XSDUHW=7Y663in^>43X zyBLI4*+ndukLM?HW+4_koE{lLj1AVkEY<5;z4p)X9yoG^<+*O~9r}fg7nX2(#h`tb z7IVM5Z_B#a6@9yQ+Z7O7LoO*B6YkXPLcFkm;EO6$bn%_DZxt%1XG3hw&K@?mim+cXjgMDN?J$T-22fc*iiyhCf>TK6A zOF^5S9Y?s3%#0;5kzlna4(pC9jn33qr-3d5iwrC_u%x&!*0p=7fo=oK5aXTuB=Q;4 zT3x$COfNmGdneyNd#k&~W!s^+ek*=p`DhlV#m$4l0zQ#SCJu{w0c6*xFp4hfnv#au z@StycBx(1w+?mijDl&q_a;!Pz%#KiT6NAOhjWbUY@I2}b;PM=?fsw#@?ujgJTN>%=={uFU8P6uO$&q9{m%MmNWtdGTjy=VZNAC@GbD-kpTRP87 zCG~Q0HIJsoxee&vBbZ1~W#4?{G9!b!Ww45dSh;K~W0{h#B%^a1 z%9J&CJQo|!rjNw)N!j%{&u&sKE_F!#b>^cj!Jcw$60tEB!Tt8_uAJUj(A{Q=x82Ok z<)*xr@q8A^u|d|8?t}V^G9{wfeJgZJyK^&jt1^~LCJz_(OkxwvTs|8gkBwzuHb!&t zST>ocH-ENoFfI9DVHA7wC)T;~CEYBS8B}#8C zy!P5_uPJ!0tFEj9Z)jNJ5`9f|%_;AV&P|@X)D%B%d%Te!w?fub*WB#A#krO7-1_d^ z9$8a8{TAP?-Zwk9dG1oZ)mOOvxotAVzo&YiJ5StBSyNqei}zON&6NH7Yy-T`E`T)_ z&^C1sT-yss9?QoEbd*wG#-c@m<-I{$)1*SK{)p>FRt zkXsr=i+1hlmx^_JokwJ;w-slNZk$J4!R!3urg#?$Zq5`+rLm&K=RCsPz8TttpwWoV zwobPlhu?4IVI-4q2Ogi$6S!Q7n_hOh-K=p4ohf5oLd-?DT#UU5HSvbBoKOBI$lPTR65N)0DaM#NfyP)r6upIn0+IqRKq#T1&&1n?Mp|2df%E53fhyBjla-1ni_mjJe z<=~iN)8$oe){(yO%5yf~)MF1Tk2k>G<#=v4&<*HvG`Qq_ucRDQfO3<4A4=bkDZUSe zV>u{`WYhg^NxHo4#G6vAKaNMX9J7r)egBEn?}vUzmY6R8w@Ellua%htVoNrE3#b8V z9eM1t2jKN}rrYdFcX^4tCoTkz*uhoOByBDU7i|Dy9H@kBx>uB>+tN=RQIjq&KG^ae zD3Nz+F7%0|B`a@liM;NVsb`jhmlUkLOo_Z_=K%rx5?tjtTq19^OCIldS$Q{?$ou@o z<~Yle&EE|r@~%h~+ZDepR^I(3@~Re?@xYRm_x2Kbr&7RKW$KT|Z&u!8CGxhk0#Ccz zs+C7YTX#Fye#qRxXZ`UmzLiHU1jeBo$AOHVlNx03+q2H?|8%`@ESVt;C zxX&D2@8g^LdRp=N55p~V#j`SarfZ)`?_LglENF@4ApNkUyr&L9+h<~Vm%7SZY7?n{ z1@LdKvDcNf>?y^SQ7 zK%JgDMW*l7V^ER2+6ofW;8^2<7ZB`=$0+y;{d#StyX5 z6&P~#n=O)q+LH9xii+f5T1k4-ba>uqGc*lr;I@_3r0;eWr8MaaIvk%3HR*Y)R$tfD zq%X_zKA52WO%q%G%XADJhP+wBMdQ*ReW?8SV z{BRCus7YV;`MhP(gb6_3hq3-A0Q|el|3==VF4R{Or~=;X;@?Wu5Ep-sR)?|znsiyW zxp-biFcxQ?PDg$ieKA`ryo?NDdlG>Z3u2|9T-v1D*hI#~Y^Swsyz% z8YxN7y<(w%Q;EL^AD6T^4k>u>X&I9&&${O@Zf=8nbly1EVwM=5<3W)e{8$(h-_i4I zK3o15uJw$918Q^Hc|LjCaAaCGJe4wd$=UK$G_vzXhHs>Xr^}z(hIU>=|AoA<>+IamS3#vm-S(Y zU!Wp6uj6^muSgD-;POJ-G4;xOT9zo6*Qza%zovx0p@hG`gnv}#yIjN6VH!SK;?McI zCCdLy2~V9&OZ0cIg~)%c#GiM)Ez$qGCH#*|_+Lo=xHngadQhj+665;|V~?qy3rhGo zB|O#kEiwKYnOAUcug=p@xE(OJ^ek!aAlf$fbn;Kfl>L5g`ndPFHuo%Ipf3Jd%s)%` zXDR<&%0J!wvy6W_wY1I-{j9@x>ZqMMTBnZJsUvpkn4LOmr;gjDV|8`9x4H`lR8x<7 zOIUmIt2flm`IcOSwR`HkD)cmg-1mn49H1HjL>V;n>93 z(e&70EHOSF8_#xP$Q;}heA9#JBSp>~wxi&z!?<<;hce^IvEoGu9-1Y`j(`SQGb5m_ zrc6Q`-*ugy#N>!Em&}{9ANQHjXmV7aaF*KU9Wv*3F>`_yOQa6RXhmv@!|+5rJE-4> z*&)MD~d(XOC8DiIKMecFZmu)N0+Gv{YHxEC1AL(k1v4%&ZZJ&h0(&^MV`|J;+K zJGGAZUU{vb$oWBV0(hBNEA?3m{cR<3Pl@4lJtn2TCQQAMf0+IgM$w(&SuP?~OPC(V z)Zh_g^O@l|hHAMqz>|a?6UldxKMHXE)_)9G&9zt?K&@e?9eOQK?S(E zK4K?uHL(l&hOV;+7$mCXy)af1IEs= z=W5_$u1WTp^{8jR*l;~)`W=z;aN=e`YSEFWk_M3$28f)46RD;_q^=8*%45X02(llN z=X{+=tqmgQki;{B&kFKNEZx5<$ayz;ngS!TK8Q43L8Q(&k@Ib$pZXaGfd;`A!9{|X z3HAx@7UX=I@u-_cqAJ}b!nMt|CPCV2B!8J8 z+avk7;I)EUljtDyUJLOFasP9{&kKG{@VkOP73BJ#@w_zPbr7f#Y!>Vkyh4x`aTsn; zFe`XU@B@NR34TuS1;JMYe<{eeOnJ3}ErPUCrqdD32wp3Ax8Ng!9}xVU;NJ>7ErlC3u(Mp9+3R@RNey75tfCC9h5&1ZD|-S@7=#za#ih zg1-}FpJ%*!!TExV1ZhW*{@VoKBzQ>hnBbcQpB4OT!7mA(6?|FHOM^WJfeQua2`&;` zBe+fQpx|M_R*`90ckF8w6Jf9uT}<@GXK52)`6Ysv32qSFPMits7L1AepztZdTLteR9suqo?gbta_jd?> zK-@nj_!q>3z!wD13BD}&Bf*~$8-QO3{))I4P*o;=1#z#o>!9V$624LVFBZN{_-^4> z3BN)3&B9+Pe2mxtBm~C+Der-=uEmx=uD5nF*D z3cgC*3wWxHe-&{rP$ztY@J+%m6uwLNRl=_oeurR8@R0atguh+*)5KQbKH>r3J%S$+ z|EIPX&KYJOKPkusUSYsUsc$nuvRWR>39WzfAmhi2DI?j|pbP z{g~j5f^QN3w-FBj?-KXN1fLZDPY8ZN+`lULg1CQ+cmVj3xc{@@zYEef3g2G^aU~EE zoJQOWgvEcp@RtaGsqh;FH;emT;jb2cSojg)bHtUvG2w3z{w;#<5ckK44)9UoKSlHc ze75IKJw6@l5DF zPaezo&pk=v#e%eaMqba4XBwks#2w;J zD{$m#RftFvXGHGJ5xL&wd!V@|@?7r{X#tH$+k-?JGUK?ZP0uz!@68eQJh}m(U2-D# zsLk;<7(3=fo|O}SE=YUlV(*XW-V91)~-OuEw+DDi~g&4RZHzD@8RLE3I(_zwzxRFIZV>HaCf z&j@}&@XLZU=f-f~7W@Ix3vI}a?s~n_3eXrfkpl;j=k3Hw!Rdnaf;6N{|G9!R`$nF2 zIEggJM%*N*%}uugG2v-{jeK74gy0Q=Zx*~$kQUh({vCqv7o@dPy3=ei@oB+l1*scM zcN%gd(h@0=Hb^Ws1}?d?zCn{_lpD<3U&%= z6U(i@O5thcj^Fidf_nuI2-4ym{WF3`1Zm2Z?zDhMe5>HSg0v(_cUr_FJ|Xy|;3ov1 z75po~=LDY@{F>lD2!31eyMjLwq%~fqLyLPv9;Xw_1Sa&ljweyiH(F)B(F$BG?%by(ulM6x zWgm{?iMZ?eN2|HBN!0U@R+)#i0(VO|+V&yOeO)5&XcD!F@K)f%!gK$eJnuRZsm4y! zcBWd5Iy;g3nndnv61lHQv7h!1Q2cGIRa(mDQEKY`uC4o!f5%oa}oVZKi!;q%5P1*?M&I-fw1p1 ze}g8v1#|s(Ulcys+cDXqL!x=joWr~QkGy5={J;CstaQEaL53@v6FC=rVrC!iseD4+ zQ~reKp5whO;ffDcJwe}^2-DVO{vps)i=L1%QN}e6k2|9 zE)X8)4+h}OnKP&K@3TbaElxz{9gECMn0K!wc(r9uZHF-JI*ctPkMh&}gGU8uh{WUZ z@n<$Xo-*EWa?Edpc)VqQ#vlP7FNb*oWqN?|mc2sG>!XDtuh*jjJjc<;WuC9IYx{W4 z;nZ;#-S0h42X;hn54X{M?0degG$2v7hgW@ldtc&>1zIig?c<}T83F!Sgm1rIo-}*m z_j150yPCff;5+K@0$FSvzGD))JeGy;xCAbb9fj{&!vq4n_ZE}h%7Cu5yLi0fXsOcCY4o%K1A1zPB4Gy@5NJ`h6ze<^T;m`R@Oq&gXUn72TQ73Vp-K?`2&XSLRo{ zR?r|%1p~tGy-@ozK1*Qy$yxtph4{IGzkZVV$7#}^Z`kkU8lsBtiTSS9BfQ~x!BO*o zkM?SO5768WKar^MSN$`uN%Qv;{U%N`%11KrhqQoZZ+R*We~n=R0h&km*D?x?<@>!K z{+bQhDyfxpK|WI8>NVe@P>fbXH;3$G4fp_Ze{xt9N7r1a`CjZ zj#lcZdN6GyIR@24cb>x3v7^y_W&-M>SscGl@4kTFZ8d*^=Jw4T$w0N}7I1p}0#=>n z@-tKE0>f{m-^Ke*lp;*l%Uia~w#LZq{2Ca6h6@27Hk{SG! zTD5`!c~4{-D{mD&|Ap1>_ukNylBjpc5s75E4CHJ;BKWcW?N;A;8t6Mx1oX=)e5&6 z)taehWoun#OZ`BdH3K`%Wmnb@Om_=&+n=2=)%5F3SF|8-flGQ2s6UUCAg!-zVym^* zQuTW*v6jlIqr!Fqo1iM1{-G1Qg$MacBJV*c&{{pJwDWi+k)HsCJp|rpa2dX2B!+M~ zk=!}b8(28W9;7>#gOf#*K@3P4V$78t&x6w(iZ#*Oh~GgFZ*6X!L~oWzn}r0l{*JF}DM!n3|Q;bVxDjL>T~o>El-(8rrkJZ_S~x_#4+8 z23~iUhW$2Yw9!a3XI7NPyRL4fTMqdJ)n%=Q%MWZ(Et_ZX=h4FD_{F`dY{T4VzZ~&)J&#f7JGq ztHX*}Bx?$Z?Qe?7Bd2KcNK7Nqnvu^fL7OguH7Hc8BGG75bRn(Z%vrQ*im{=vYHMz2 zZl4pK)7(xIHriayO8>DhH@3GoMmsO-Xm6*JGt%bN-{c9nEaa?E({1Qg9Sjp*;_=Yj zjjfx+7 z!paC`M<+cp{U@#W6mlR&2gIC$Hi|&AE5*-8$*{@V;|x~YNHz8oj5VAbhT?~l|5vOM znEk0YvP;0>^o{HbaEP5^KVVHYkNyj!hvK%}@zH#I08|Y(n6gjQJx3e$#?dyA69sRr zkY22yQiXJv&v_KmOMJDg;>#$NavdQl}pO7-o{G{a0e-1>tb4x7m$??!SG!vCCAb1#` z|LT%UZK@*?lZ1*-TLv|Zg7`_6Lve*Az67`ue#+uA2#}&EC=0fIe6ym zE(i5p++@qavuAfXtX_;w!=}sa9P37!-cYPRt2e{)8-w6QJ!bCd+Nm4K)~hiMUgWu_ z>n6+os3d<3$8@ZQo6X-3O7b_?l|L>DY`p}zz?R=1{ ztlxztdeMs;fCoM1&aGQNUN7uzWB`*sOwoa{ek)4S`Cvm9u3IoL%D@9`NibVZl zH#sPqGREiwP!~BUFOgTS!}EO3PVh9PsPV~P63ZgNmrlAe3^#`>!+Nzaa^h8#?7 zMARR4kC9VHOv+wx5g!T{;&bV^BZ61DaSS&SZcTM z6Dq><*9t5#KF@wFkw0u139t963;C&buWS=k3N&hf9d-p(oM7{*pr=-%zE+$%=ki&u zXL9*$Vssq2Tp~U;gi+B`8&2l63L6)QBLx$oW~(&VV!lsAQbB+0V)1V^bx7oIC8>@lst9C ziTa*k6#BOxi29s33h2Yds5wm`{;h=nuHX#rJVuRvIgz@yME*!A@qi$YImsUt)W5tQ zm3w+o7=4x~@HgWBir_B=^*yyHaE2#KQQ#Rteg7;9{91T@@60Fn&U`>Q?^n$R_?zm) zMq(7WSa^Nk%m;Ll_rcsVn+^0yxZT7cuut%6;%s0{Fh`66CxyRB_&*VzKVVM(M}&X3 z@E;QXW5givXM$S4Wj63d;r~YPWnvWgSHYD$X^P5yuUfh9RSWDD_c(DjFeJRb_ca^1 zUfi`2{wVMSdHIB}{Cp(p`z5^pAUsDg^8eBMt6Uo~JZ*>(`2%G{{t_24E~wk5PuizX z?vwb;Q6KSU38(eCg3xOfqSosQ0`H}NQ0}n?0sfEvCj^fR^2Czv)bAwf`>#RhIV4f*j|G7z#9!Zk4FaDKo=1ml zKVK5mzb94;yez!dFRO*=m$l|Jk@#!z=d8nXp^R@XwC#sqQKqNck&K6YzqY+`eoueh r?)bZy@P&?Keyz5%v>2Ksc%U+bLBo$E%3hp1u@dy diff --git a/android/android-ndk-profiler/prof.h b/android/android-ndk-profiler/prof.h deleted file mode 100644 index 2448612761..0000000000 --- a/android/android-ndk-profiler/prof.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Part of the android-ndk-profiler library. - * Copyright (C) Richard Quirk - * - * This library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - */ -#ifndef prof_h_seen -#define prof_h_seen -#ifdef __cplusplus -extern "C" { -#endif - -void monstartup(const char *libname); -void moncleanup(void); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/android/jni/Android.mk b/android/jni/Android.mk index a6cdedb5bd..1b7bde5a44 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -696,10 +696,6 @@ $(call import-module,libzip) $(call import-module,glslang-build) $(call import-module,miniupnp-build) -ifeq ($(ANDROID_NDK_PROFILER),1) - $(call import-module,android-ndk-profiler) -endif - jni/$(SRC)/git-version.cpp: -./git-version-gen.sh -..\Windows\git-version-gen.cmd diff --git a/android/jni/Locals.mk b/android/jni/Locals.mk index d18d5d6e85..532693d05b 100644 --- a/android/jni/Locals.mk +++ b/android/jni/Locals.mk @@ -80,9 +80,3 @@ ifeq ($(TARGET_ARCH_ABI),arm64-v8a) LOCAL_LDLIBS += $(LOCAL_PATH)/../../ffmpeg/android/arm64/lib/libavutil.a LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../ffmpeg/android/arm64/include endif - -# Compile with profiling. -ifeq ($(ANDROID_NDK_PROFILER),1) - LOCAL_CFLAGS += -pg -DANDROID_NDK_PROFILER - LOCAL_STATIC_LIBRARIES += android-ndk-profiler -endif diff --git a/headless/Headless.cpp b/headless/Headless.cpp index 1dc70e488d..51e912442d 100644 --- a/headless/Headless.cpp +++ b/headless/Headless.cpp @@ -38,12 +38,6 @@ #include "SDLHeadlessHost.h" #endif -// https://github.com/richq/android-ndk-profiler -#ifdef ANDROID_NDK_PROFILER -#include -#include "android/android-ndk-profiler/prof.h" -#endif - #if defined(ANDROID) JNIEnv *getEnv() { return nullptr; @@ -230,12 +224,6 @@ int main(int argc, const char* argv[]) _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif -#ifdef ANDROID_NDK_PROFILER - setenv("CPUPROFILE_FREQUENCY", "500", 1); - setenv("CPUPROFILE", "/sdcard/gmon.out", 1); - monstartup("ppsspp_headless"); -#endif - bool fullLog = false; bool autoCompare = false; bool verbose = false; @@ -478,9 +466,5 @@ int main(int argc, const char* argv[]) LogManager::Shutdown(); delete printfLogger; -#ifdef ANDROID_NDK_PROFILER - moncleanup(); -#endif - return 0; } From c3ddb279f949c688ea62fd0231a6ff9ceea20410 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Jan 2021 08:51:46 -0800 Subject: [PATCH 5/6] http: Cleanup excessive logging. --- Common/Net/HTTPClient.cpp | 2 ++ Common/Net/HTTPHeaders.cpp | 10 +++++----- Common/Net/HTTPServer.cpp | 16 +++++++++++++--- Common/Net/Sinks.cpp | 8 ++++++++ 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/Common/Net/HTTPClient.cpp b/Common/Net/HTTPClient.cpp index b8be625400..7193582fa5 100644 --- a/Common/Net/HTTPClient.cpp +++ b/Common/Net/HTTPClient.cpp @@ -366,6 +366,7 @@ int Client::ReadResponseHeaders(Buffer *readbuf, std::vector &respo if (code_pos != line.npos) { code = atoi(&line[code_pos]); } else { + ERROR_LOG(IO, "Code not parse HTTP status code"); return -1; } @@ -377,6 +378,7 @@ int Client::ReadResponseHeaders(Buffer *readbuf, std::vector &respo } if (responseHeaders.size() == 0) { + ERROR_LOG(IO, "No HTTP response headers"); return -1; } diff --git a/Common/Net/HTTPHeaders.cpp b/Common/Net/HTTPHeaders.cpp index acb554ee70..ef19d3bc9d 100644 --- a/Common/Net/HTTPHeaders.cpp +++ b/Common/Net/HTTPHeaders.cpp @@ -33,7 +33,7 @@ bool RequestHeader::GetParamValue(const char *param_name, std::string *value) co for (size_t i = 0; i < v.size(); i++) { std::vector parts; SplitString(v[i], '=', parts); - INFO_LOG(IO, "Param: %s Value: %s", parts[0].c_str(), parts[1].c_str()); + DEBUG_LOG(IO, "Param: %s Value: %s", parts[0].c_str(), parts[1].c_str()); if (parts[0] == param_name) { *value = parts[1]; return true; @@ -121,13 +121,13 @@ int RequestHeader::ParseHttpHeader(const char *buffer) { if (!strncasecmp(key, "User-Agent", key_len)) { user_agent = new char[value_len + 1]; memcpy(user_agent, buffer, value_len + 1); - INFO_LOG(IO, "user-agent: %s", user_agent); + VERBOSE_LOG(IO, "user-agent: %s", user_agent); } else if (!strncasecmp(key, "Referer", key_len)) { referer = new char[value_len + 1]; memcpy(referer, buffer, value_len + 1); } else if (!strncasecmp(key, "Content-Length", key_len)) { content_length = atoi(buffer); - INFO_LOG(IO, "Content-Length: %i", (int)content_length); + VERBOSE_LOG(IO, "Content-Length: %i", (int)content_length); } else { std::string key_str(key, key_len); std::transform(key_str.begin(), key_str.end(), key_str.begin(), tolower); @@ -150,12 +150,12 @@ void RequestHeader::ParseHeaders(net::InputSink *sink) { line_count++; if (type == SIMPLE) { // Done! - INFO_LOG(IO, "Simple: Done parsing http request."); + VERBOSE_LOG(IO, "Simple: Done parsing http request."); break; } } - INFO_LOG(IO, "finished parsing request."); + VERBOSE_LOG(IO, "finished parsing request."); ok = line_count > 1; } diff --git a/Common/Net/HTTPServer.cpp b/Common/Net/HTTPServer.cpp index da114da85a..1deb45f72c 100644 --- a/Common/Net/HTTPServer.cpp +++ b/Common/Net/HTTPServer.cpp @@ -54,7 +54,7 @@ Request::Request(int fd) header_.ParseHeaders(in_); if (header_.ok) { - INFO_LOG(IO, "The request carried with it %i bytes", (int)header_.content_length); + VERBOSE_LOG(IO, "The request carried with it %i bytes", (int)header_.content_length); } else { Close(); } @@ -171,8 +171,13 @@ bool Server::Listen4(int port) { setsockopt(listener_, SOL_SOCKET, SO_REUSEADDR, (const char *)&opt, sizeof(opt)); if (bind(listener_, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { +#if PPSSPP_PLATFORM(WINDOWS) + int err = WSAGetLastError(); +#else + int err = errno; +#endif + ERROR_LOG(IO, "Failed to bind to port %d, error=%d - Bailing (ipv4)", port, err); closesocket(listener_); - ERROR_LOG(IO, "Failed to bind to port %d. Bailing.", port); return false; } @@ -216,8 +221,13 @@ bool Server::Listen6(int port, bool ipv6_only) { setsockopt(listener_, IPPROTO_IPV6, IPV6_V6ONLY, (const char *)&opt, sizeof(opt)); if (bind(listener_, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { +#if PPSSPP_PLATFORM(WINDOWS) + int err = WSAGetLastError(); +#else + int err = errno; +#endif + ERROR_LOG(IO, "Failed to bind to port %d, error=%d - Bailing (ipv6)", port, err); closesocket(listener_); - ERROR_LOG(IO, "Failed to bind to port %d. Bailing.", port); return false; } diff --git a/Common/Net/Sinks.cpp b/Common/Net/Sinks.cpp index 2d15de15cf..2eadf3fe62 100644 --- a/Common/Net/Sinks.cpp +++ b/Common/Net/Sinks.cpp @@ -385,6 +385,14 @@ void OutputSink::AccountPush(size_t bytes) { void OutputSink::AccountDrain(int bytes) { if (bytes < 0) { +#if PPSSPP_PLATFORM(WINDOWS) + int err = WSAGetLastError(); + if (err == WSAEWOULDBLOCK) + return; +#else + if (errno == EWOULDBLOCK || errno == EAGAIN) + return; +#endif ERROR_LOG(IO, "Error writing to socket"); return; } From 8bf93bb757aaf216561e44c9cf65332d595a1c93 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Jan 2021 08:58:35 -0800 Subject: [PATCH 6/6] http: Ignore signals on recv() too. --- Common/Buffer.cpp | 6 +++--- Common/Net/Sinks.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Common/Buffer.cpp b/Common/Buffer.cpp index 423c2cfb3c..68c7e7682e 100644 --- a/Common/Buffer.cpp +++ b/Common/Buffer.cpp @@ -196,7 +196,7 @@ bool Buffer::ReadAll(int fd, int hintSize) { } while (true) { - int retval = recv(fd, &buf[0], (int)buf.size(), 0); + int retval = recv(fd, &buf[0], (int)buf.size(), MSG_NOSIGNAL); if (retval == 0) { break; } else if (retval < 0) { @@ -228,7 +228,7 @@ bool Buffer::ReadAllWithProgress(int fd, int knownSize, float *progress, bool *c return false; ready = fd_util::WaitUntilReady(fd, CANCEL_INTERVAL, false); } - int retval = recv(fd, &buf[0], (int)buf.size(), 0); + int retval = recv(fd, &buf[0], (int)buf.size(), MSG_NOSIGNAL); if (retval == 0) { return true; } else if (retval < 0) { @@ -248,7 +248,7 @@ int Buffer::Read(int fd, size_t sz) { char buf[1024]; int retval; size_t received = 0; - while ((retval = recv(fd, buf, (int)std::min(sz, sizeof(buf)), 0)) > 0) { + while ((retval = recv(fd, buf, (int)std::min(sz, sizeof(buf)), MSG_NOSIGNAL)) > 0) { if (retval < 0) { return retval; } diff --git a/Common/Net/Sinks.cpp b/Common/Net/Sinks.cpp index 2eadf3fe62..0272465b08 100644 --- a/Common/Net/Sinks.cpp +++ b/Common/Net/Sinks.cpp @@ -170,7 +170,7 @@ void InputSink::Fill() { // Whatever isn't valid and follows write_ is what's available. size_t avail = BUFFER_SIZE - std::max(write_, valid_); - int bytes = recv(fd_, buf_ + write_, (int)avail, 0); + int bytes = recv(fd_, buf_ + write_, (int)avail, MSG_NOSIGNAL); AccountFill(bytes); } }